<!DOCTYPE html>
<html lang="en">

<head>
    <meta charset="UTF-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Document</title>
    <!-- 
        es6数据结构  类似数组 成员的值都是唯一的 没有重复
     -->


</head>

<body>
    <div class="div1"></div>
    <div class="div2"></div>
    <div class="div3"></div>
    <div class="div4"></div>
    <div class="div5"></div>
    <script>
        // 1.可以放伪数组或者是一个数组
        const set1 = new Set(document.getElementsByTagName('div'))
        const set2 = new Set([2, 4, 1, 2,])
        // 2.add方法往set里面加东西
        set2.add(set1)
        console.log(set1, set2);

        // 3.数组去重
        const arr1 = [1, 1, 1, 2, 3, 4]
        const norepeatArr = [...new Set(arr1)]
        // 第二种去重方法 Array.from可以把set转换成数组
        const norepeatArr2 = Array.from(new Set(arr1))

        // 4.字符串去重
        const str1 = 'aaabc'
        const norepeatStr = [...new Set(str1)].join('')
        console.log('字符串和数组去重', norepeatArr, norepeatStr, norepeatArr2);

        // 5.往set里面加入多个相同的值的时候，一般是按 === 去运算，有一个不同，nan === nan返回的是false 但是一个set里面只能最多有一个nan
        const nan1 = NaN
        const nan2 = NaN
        const set3 = new Set()
        set3.add(nan1)
        set3.add(nan2)
        console.log('set3 测试nan', set3);

        // 6.两个空对象不相等 存地址值
        const set4 = new Set()
        set4.add({})
        set4.add({})
        console.log('存了两个空对象', set4.size);

        // 7. 四个方法 has add  delete clear
        set4.add(1).add(2).add(2)
        if (set4.has(1)) {
            set4.delete(2)
            set4.clear()
            console.log('set的四种api之后', set4);
        }

        /*
        8.
        set的key value是相等的
        Set.prototype.keys()：返回键名的遍历器
        Set.prototype.values()：返回键值的遍历器
        Set.prototype.entries()：返回键值对的遍历器
        Set.prototype.forEach()：使用回调函数遍历每个成员
        */
        for (const item of set3.entries()) {
            console.log('set3的值是',set3,'entries键值对遍历器',item);
        }
        set3.forEach((keys,value)=>console.log('foreach方法',keys,value))

        /* 
            9.实现交集并集
        */
       const arrA = [1,3,2,4]
       const arrB = [2,3,4,5]

        // 并集
        console.log('并集',new Set([...arrA,...arrB]));
        // 交集
        console.log('数组交集',arrA.filter(ele => arrB.includes(ele)));
        const setA = new Set(arrA)
        const setB = new Set(arrB)
        console.log('set交集',[...setA].filter(ele=>setB.has(ele)));
    </script>
</body>

</html>